﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MongoDB;
using System.Web.Configuration;
using System.Configuration;


namespace AppPort
{  
    /// <summary>
    /// Summary description for AppPortConveyor
    /// </summary>
    public class AppPortConveyor : IAppPortConveyor
    {
        private HttpContext context = null;
        
        private IServerService service = null;
        
        private MongoConnectionStringBuilder connectionStringBuilder = null;

        public AppPortConveyor(MongoConnectionStringBuilder connectionStringBuilder, HttpContext context, IServerService service)
        {
            this.connectionStringBuilder = connectionStringBuilder;
            this.context = context;
            this.service = service;
        }

        /// <summary>
        /// Парсим тело запроса в BodyRequest.
        /// В BodyRequest - добавляем параметр пользователь из HttpContext
        /// Запускаем Сервис
        /// </summary>
        public void ProcessRequest()
        {
            string result = string.Empty;

            ServiceCmd p = ParseRequest(context);

            if (null == p)
            {
                context.Response.Write("{success:false, result:'Не определены параметры команды'}");
                return;
            }
            try
            {
                result = service.RunService(p);
                //context.Response.Write
            }
            catch (Exception e)
            {
                context.Response.Write("{success:false, result:'" + e.Message + "'}");
                return;
            }

            context.Response.ContentType = "application/json";
            result = (result == string.Empty ? "{success:true, d:[]}" : result);
            context.Response.Write(result);
        }

        /// <summary>
        /// Запустить сервис 
        /// </summary>
        /// <param name="ServiceParmrs"></param>
        /// <returns></returns>
        public virtual string RunService(ServiceCmd ServiceParams)
        {
            return string.Empty;
        }

        ///// <summary>
        ///// Разобрать тело запроса - сформировать параметры запроса 
        ///// </summary>
        ///// <param name="context"></param>
        ///// <returns></returns>
        //private ServiceCmd ParseRequestBody(HttpContext context)
        //{
        //    ServiceCmd result = null;
        //    result = AppPortConveyor.ParseBody(context);
        //    // Прописать текущего пользователя как владельца команды
        //    result.connectionStringBuilder = this.connectionStringBuilder;

        //    // Если не указано количество строк на страницу - ставим 100
        //    result.limit = (result.limit == 0 ? 100 : result.limit);

        //    return result;
        //}
        public   ServiceCmd ParseRequest(HttpContext context)
        {
            if (context.Request.RequestType == "GET")
                return ParseHeaders(context);

            else
                return ParseBody(context);    

        }

        private  ServiceCmd ParseBody(HttpContext context)
        {
            try
            {
                ServiceCmd result = null;
                string sRequest = string.Empty;

                //получить - тело запроса как json
                sRequest = GetRequestBodyAsString(context.Request);

                //параметры не прибыли
                if (string.Empty == sRequest)
                {
                    return null;
                }

                //Преобразовать json  в объект команду                
                result = Helper.Json<ServiceCmd>.Deserialize(sRequest);
                return result;


            }
            catch (Exception e)
            {
                context.Response.Write("{success:false, result:'" + e.Message + "'}");
                return null;
            }
        }

        private  ServiceCmd ParseHeaders(HttpContext context)
        {
            try
            {
                int limit = (context.Request["limit"]==null?-1:Convert.ToInt16 (context.Request["limit"]));
                int start = (context.Request["start"]==null?-1:Convert.ToInt16 (context.Request["start"]));
                int page = (context.Request["page"] == null ? -1 : Convert.ToInt16(context.Request["page"]));
               

                ServiceCmd result = new ServiceCmd();
                result.connectionStringBuilder = this.connectionStringBuilder;
                result.Procedure = GetServiceCmdProcedure(context); 
                result.args =context.Request ["args"];
                result.Start = start;
                return result;
            }
            catch (Exception e)
            {
                context.Response.Write("{success:false, result:'" + e.Message + "'}");
                return null;
            }
        }

        /// <summary>
        /// Вернуть имя метода
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private static  string GetServiceCmdProcedure(HttpContext context) {
            return context.Request.PathInfo.Replace (@"/",string.Empty ) ;
        }

        /// <summary>
        /// Считывает тело запроса как JSON
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
       private static string GetRequestBodyAsString(HttpRequest request)
        {
            System.IO.Stream body = request.InputStream;
            System.Text.Encoding encoding = request.ContentEncoding;
            System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
            string result = reader.ReadToEnd();
            reader.Close();
            return result;
        }
    }
}